package com.kuang.productConsumer;

/**
 * A B C D 线程交替打印
 */
public class ProducerConsumerDemoABCD {
    public static void main(String[] args) {

        // 1.准备资源类
        Goods1 goods = new Goods1();

        // 2.创建多线程， 3.将资源类抛进去
        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    goods.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "A").start();  // A线程+1
        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    goods.decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "B").start();  // B线程-1
        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    goods.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "C").start();  // C线程+1
        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    goods.decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "D").start();  // D线程-1


        /*
            打印结果：
                ...
                B=>0
                C=>1
                A=>2
                C=>3
                B=>2
                B=>1
                B=>0
                ...
            存在这种打印结果，为什么？
                因为if判断，判断一次，会造成虚假唤醒，  ？？？？？？？？？？？？？？？？？？？？
                解决办法：while循环判断  替换后，打印结果：1 0 交替
                A=>1
                B=>0
                A=>1
                B=>0
                A=>1
                B=>0
                A=>1
                B=>0
                A=>1
                B=>0
                C=>1
                B=>0
                A=>1
                B=>0
                C=>1
                B=>0
                A=>1
                B=>0
                C=>1
                B=>0
                A=>1
                D=>0
                C=>1
                D=>0
                A=>1
                D=>0
                C=>1
                D=>0
                A=>1
                D=>0
                C=>1
                D=>0
                C=>1
                D=>0
                C=>1
                D=>0
                C=>1
                D=>0
                C=>1
                D=>0
         */


    }
}

class Goods1{
    private int number = 0;

    //+1 生产了一件物品
    public synchronized void increment() throws InterruptedException {
        while (number != 0){   //O的时候，干活，不是0的时候，等待
            // 等待  窗口有一碗饭时，等会
            this.wait();
        }
        // 业务
        number ++;
        System.out.println(Thread.currentThread().getName() + "=>" + number);
        // 通知其他线程，我+1完毕了
        this.notifyAll();  // 通知唤醒其他线程
    }

    //-1 消费了一件物品
    public synchronized void decrement() throws InterruptedException {
        while (number == 0){   //1的时候，干活，不是1的时候，等待
            // 等待 窗口没有饭时，等会
            this.wait();
        }
        // 业务
        number --;
        System.out.println(Thread.currentThread().getName() + "=>" + number);
        // 通知其他线程，我-1完毕了
        this.notifyAll();  // 通知唤醒其他线程
    }
}

